StupidNote
glibc2.31下的off-by-null,禁用了execve,并且加了点料
这里的off-by-null藏得很深,我也是在放出hint后才找到的
两个大功能:
add
,delete
add限制了size <= 0x200
delete有两种释放堆块的方法,puts-free和edit-free;并且不是简单的调用free,而且通过对free_hook进行赋值为函数地址来实现,这种做法直接导致后面orw时无法通过free_hook结合setcontext来完成;
利用:
1、泄漏堆地址
2、利用off-by-null构造unlink实现overlap,注意glibc-2.31下对size,prev_size都有检测
3、在orw读取flag的时候因为不能用free_hook,所以只能重新找一个适合的地址;最后在exit中找到这样的汇编,所以只要控制了 rip + 0x1cba7
跟 rip + 0x1d1a1
,就相当于调用任意函数并且控制了参数
上图的两个地址跟在不同环境还是有点差别的,在桌面版里面我是libc_base + 0x236968
跟libc_base + 0x236f68
;而在docker里面是libc_base + 0x22c968
跟libc_base + 0x22cf68
两个环境下相差0xa000
;所以猜测偏移为0xa000*n
,最终爆出来远程跟本地相差0x14000
(=0xa000*2)
exp:
1 | #coding:utf-8 |